home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 021-030 / amok23 / dumpdiff / dumpdiff.mod < prev    next >
Text File  |  1993-11-04  |  4KB  |  179 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    DumpDiff.mod
  3.     :Author.     Fridtjof Siebert
  4.     :Address.    Nobileweg 67, D-7000 Stuttgart 40
  5.     :Phone.      (0)711/822509
  6.     :Shortcut.   [fbs]
  7.     :Version.    1.0
  8.     :Date.       13-Aug-89
  9.     :Copyright.  PD
  10.     :Language.   Modula-II
  11.     :Translator. M2Amiga v3.2
  12.     :History.    created from Bernd Preusing's Diff Program
  13.     :Contents.   Show differences of two files
  14. ---------------------------------------------------------------------------*)
  15.  
  16. MODULE DumpDiff;
  17.  
  18. FROM SYSTEM IMPORT
  19.     ADR, ADDRESS, CAST;
  20.  
  21. FROM InOut IMPORT
  22.     Write, WriteString, WriteLn, WriteHex, WriteInt;
  23.  
  24. FROM Arts IMPORT
  25.     Assert;
  26.  
  27. FROM FileSystem IMPORT
  28.     File, Lookup, Close, ReadBytes, Response, Length;
  29.  
  30. FROM Arguments IMPORT
  31.      NumArgs, GetArg;
  32.  
  33. FROM Heap IMPORT Allocate, Deallocate;
  34.  
  35. TYPE wp = PROCEDURE(CHAR);
  36.  
  37. VAR i,l1,l2,errs:LONGINT;
  38.     f1,f2:File;
  39.     len:INTEGER;
  40.     s1,s2:ARRAY[0..50] OF CHAR;
  41.     a1,a2: POINTER TO CHAR;
  42.     equalmode: BOOLEAN;
  43.     S1,S2,ch1,ch2: ARRAY [0..255] OF CHAR;
  44.     L1,L2,cL1,cL2: INTEGER;
  45.  
  46.  
  47. PROCEDURE write1(c: CHAR);
  48.  
  49. BEGIN
  50.   S1[L1] := c; INC(L1);
  51. END write1;
  52.  
  53. PROCEDURE write2(c: CHAR);
  54.  
  55. BEGIN
  56.   S2[L2] := c; INC(L2);
  57. END write2;
  58.  
  59. PROCEDURE writec2(c: CHAR);
  60.  
  61. BEGIN
  62.   ch2[cL2] := c; INC(cL2);
  63. END writec2;
  64.  
  65. PROCEDURE writec1(c: CHAR);
  66.  
  67. BEGIN
  68.   ch1[cL1] := c; INC(cL1);
  69. END writec1;
  70.  
  71. PROCEDURE write(c: CHAR);
  72.  
  73. BEGIN
  74.   write1(c); write2(c); writec1(c); writec2(c);
  75. END write;
  76.  
  77. PROCEDURE Mode(ok: BOOLEAN);
  78.  
  79. BEGIN
  80.   IF ok # equalmode THEN
  81.     equalmode := ok;
  82.     write(33C); write("[");
  83.     IF ok THEN write("0") ELSE write("3"); write("3") END;
  84.     write("m");
  85.   END;
  86.   IF NOT ok THEN INC(errs) END;
  87. END Mode;
  88.  
  89. PROCEDURE whex(c: CHAR; p: wp);
  90.  
  91.   PROCEDURE whexdig(i: INTEGER);
  92.  
  93.   BEGIN
  94.     IF i>9 THEN INC(i,55) ELSE INC(i,30H) END;
  95.     p(CHR(i));
  96.   END whexdig;
  97.  
  98. BEGIN
  99.   whexdig(ORD(c) DIV 16); whexdig(ORD(c) MOD 16);
  100. END whex;
  101.  
  102. PROCEDURE Out();
  103.  
  104. BEGIN
  105.   Mode(TRUE); WriteHex(i-7,8); WriteString(":  ");
  106.   S1[L1] := 0C; WriteString(S1); Write(" "); L1 := 0; ch1[cL1] := 0C; WriteString(ch1); cL1 := 0;
  107.   WriteString("  |  ");
  108.   S2[L2] := 0C; WriteString(S2); Write(" "); L2 := 0; ch2[cL2] := 0C; WriteString(ch2); cL2 := 0;
  109.   WriteLn;
  110. END Out;
  111.  
  112. PROCEDURE writehex(c1,c2: CHAR);
  113.  
  114.   PROCEDURE ascii(c: CHAR): CHAR;
  115.  
  116.   BEGIN
  117.     CASE c OF 40C..177C,240C..377C: RETURN c ELSE RETURN "." END;
  118.   END ascii;
  119.  
  120. BEGIN
  121.   whex(c1,write1); writec1(ascii(c1));
  122.   whex(c2,write2); writec2(ascii(c2));
  123.   IF i MOD 4 = 3 THEN write1(" "); write2(" ") END;
  124.   IF (i MOD 8 = 7) THEN Out END;
  125. END writehex;
  126.  
  127. BEGIN
  128.   i:=NumArgs();
  129.   errs:=0; equalmode := TRUE;
  130.   IF i#2 THEN
  131.     WriteString("usage: DumpDiff file1 file2");
  132.     WriteLn;
  133.   ELSE
  134.     GetArg(1,s1,len);
  135.     GetArg(2,s2,len);
  136.     Lookup(f1,s1,0,FALSE);
  137.     Assert(f1.res=done,ADR("1.File nicht zu öffnen."));
  138.     Lookup(f2,s2,0,FALSE);
  139.     IF f2.res#done THEN
  140.       Close(f1);
  141.       Assert(f2.res=done,ADR("2.File nicht zu öffnen."));
  142.     END;
  143.     Length(f1,l1);
  144.     Length(f2,l2);
  145.     Allocate(a1,l1);
  146.     Assert(a1#NIL,ADR("Nicht genug Speicher für File1"));
  147.     Allocate(a2,l2);
  148.     Assert(a2#NIL,ADR("Nicht genug Speicher für File1"));
  149.     ReadBytes(f1,a1,l1,i);
  150.     Assert(f1.res=done,ADR("Lesefehler File1"));
  151.     ReadBytes(f2,a2,l2,i);
  152.     Assert(f2.res=done,ADR("Lesefehler File2"));
  153.     Close(f1); Close(f2);
  154.     i:=0;
  155.     REPEAT
  156.       Mode(CAST(CHAR,a1^)=CAST(CHAR,a2^));
  157.       writehex(a1^,a2^);
  158.       INC(a1); INC(a2);
  159.       INC(i); DEC(l1); DEC(l2);
  160.     UNTIL (l1<=0) OR (l2<=0);
  161.     Mode(TRUE);
  162.     IF i MOD 8 # 0 THEN
  163.       WHILE i MOD 8 # 0 DO
  164.         write1(" "); write2(" "); write(" ");
  165.         IF i MOD 4 = 3 THEN write1(" "); write2(" ") END;
  166.         INC(i)
  167.       END;
  168.       Out();
  169.     END;
  170.     IF errs#0 THEN
  171.       WriteInt(errs,5);
  172.     ELSE
  173.       WriteString("Keine");
  174.     END;
  175.     WriteString(" Unterschiede gefunden.");
  176.     WriteLn;
  177.   END;
  178. END DumpDiff.
  179.